package pessoal;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;




import util.Conexao;
import util.ErroAcessoRepositorioException;


public class RepositorioPessoaBDR {
	
	
	
	protected static final String UPDATE_PESSOA = "UPDATE pessoa SET nome = ? ,  rua = ? , numero = ? , complemento = ? , bairro = ? , " +
	"cidade = ? , cep = ?, uf = ? WHERE cpf = ?";
	
	protected static final String INSERT_PESSOA="INSERT INTO pessoa (cpf,nome,rg," +
	"rua,numero,complemento,bairro,cidade,cep,uf) VALUES (?,?,?,?,?,?,?,?,?,?)";
	
	protected static final String CONSULTA_PESSOA = "SELECT * FROM pessoa WHERE cpf = ?";
	
	protected static final String DELETE_PESSOA = "DELETE FROM pessoa WHERE cpf = ?";
	
	protected static final String MSG_ERRO_ACESSO_BD =
		"Erro de acesso ao banco de dados";
	
	protected void alterarPessoa (Pessoa pessoa) throws ErroAcessoRepositorioException{
		PreparedStatement pstmt= null;
		Connection con = Conexao.getConexao();
		try {
			pstmt = con.prepareStatement(UPDATE_PESSOA);
			pstmt.setString(1, pessoa.getNome());
			pstmt.setString(2, pessoa.getEndereco().getRua());
			pstmt.setString(3, pessoa.getEndereco().getNumero());
			pstmt.setString(4, pessoa.getEndereco().getComplemento());
			pstmt.setString(5, pessoa.getEndereco().getBairro());
			pstmt.setString(6, pessoa.getEndereco().getCidade());
			pstmt.setString(7, pessoa.getEndereco().getCep());
			pstmt.setString(8, pessoa.getEndereco().getUf());
			pstmt.setString(9, pessoa.getCpf());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD,
					e,
					e.getErrorCode());
		} finally{
			Conexao.fechaRecursos(con,pstmt,null);
		}
	}
	
	protected void inserePessoa (Pessoa pessoa) throws ErroAcessoRepositorioException{
		PreparedStatement pstmt= null;
		Connection con = Conexao.getConexao();
		if(!existePessoa(pessoa.getCpf())){
			con = Conexao.getConexao();
			try {
				pstmt=con.prepareStatement(INSERT_PESSOA);
				pstmt.setString(1, pessoa.getCpf());
				pstmt.setString(2, pessoa.getNome());
				pstmt.setString(3, pessoa.getRg());
				pstmt.setString(4, pessoa.getEndereco().getRua());
				pstmt.setString(5, pessoa.getEndereco().getNumero());
				pstmt.setString(6, pessoa.getEndereco().getComplemento());
				pstmt.setString(7, pessoa.getEndereco().getBairro());
				pstmt.setString(8, pessoa.getEndereco().getCidade());
				pstmt.setString(9, pessoa.getEndereco().getCep());
				pstmt.setString(10, pessoa.getEndereco().getUf());
				pstmt.executeUpdate();
			} catch (SQLException e) {
				throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD,
						e,
						e.getErrorCode());
			} finally{
				Conexao.fechaRecursos(con,pstmt,null);
			}
		}
	}
	
	protected boolean existePessoa(String cpf) throws ErroAcessoRepositorioException {
		Connection con = null;
		PreparedStatement pstmt = null;
		con = Conexao.getConexao();
		ResultSet rs = null;
		try {
			pstmt=con.prepareStatement(CONSULTA_PESSOA);
			pstmt.setString(1, cpf);
			rs = pstmt.executeQuery();
			if(rs.next()){
				String qtdLinhas = rs.getString(1);
				return (qtdLinhas != null);
			}
		} catch (SQLException e) {
			throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD,
					e,
					e.getErrorCode());
		}finally{
			Conexao.fechaRecursos(con,pstmt,rs);
		}
		
		return false;
	}
	
	protected void excluirPessoa(String cpf)throws ErroAcessoRepositorioException {
		PreparedStatement pstmt = null;
		Connection con = null;
		con = Conexao.getConexao();
		try {
			pstmt = con.prepareStatement(DELETE_PESSOA);
			pstmt.setString(1, cpf);
			pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD,
					e,
					e.getErrorCode());
		}finally{
			Conexao.fechaRecursos(con,pstmt,null);
		}
	}
}
